Workshop
;Datei       : listing8.asm
;Beschreibung: Eine Bitplane (320 x 512) mit Muster die hoch und
;              runter scrollt.
;Autor       : Enrico Bauermeister
;Datum       : 16.12.1997
;Assembler   : TFA AsmOne v1.30
;===============================================================

;Interrupts sperren - Betriebssystem ausschalten
;-----------------------------------------------
 move.w   #$4000,$dff09a

;Sprites ausschalten (sonst stören die nur)
;------------------------------------------
 move.w   #$0020,$dff096

;Adresse der Bitplane in die Bitplanepointer eintragen
;-----------------------------------------------------
;Zuerst wird das Low-Word in $dff0e2 und anschließend das High-Word in
;$dff0e0 eingetragen.
;-----------------------------------------------------
 move.l   #bitplane,d0          ;Bitplane-Aresse nach d0
 move.w   d0,bitplanepointer+6  ;Low-Word eintragen
 swap     d0                    ;Words in d0 vertauschen
 move.w   d0,bitplanepointer+2  ;High-Word eintragen

;Copperliste aktivieren
;----------------------
 move.l   #Copperliste,$dff084

;Muser erzeugen
;--------------
 bsr.w    muster

;Warten auf Rasterstrahl (eine 1/50 Sekunde)
;-------------------------------------------
wait:
 move.l   $dff004,d0
 and.l    #$fff00,d0
 cmp.l    #$00003000,d0
 bne.s    wait

;Bildschirm scrollen
;-------------------
 bsr.w    scroll

;Linke Maustaste gedrückt ?
;--------------------------
 btst     #6,$bfe001
 bne.s    wait

;Sprites wieder einschalten
;--------------------------
 move.w   #$8020,$dff096

;Interrupts wieder erlauben
;--------------------------
 move.w   #$c000,$dff09a

;Programmende
;------------
 moveq    #0,d0
 rts

;Datenbereich
;------------
richtung: dc.b 0,0

;Routine um ein Muster auf der Bitplane zu erzeugen
;--------------------------------------------------
muster:
 lea      bitplane,a0    ;Adresse der Bitplane
 moveq    #16-1,d0       ;16 Paare von 16 Punkten hohen Quadraten
                         ;(jedes Paar (ein schwarzes und ein weißes
                         ; Quadrat) ist 32 Punkte hoch -> 8 Paare
                         ; davon untereinander und die Bitplane ist
                         ; voll (512 Punkte hoch))
mpaar:
 move.l   #(10*16)-1,d1  ;10 Paare um eine Zeile zu füllen (320 Punkte)
                         ;16 Zeilen sind zu füllen
meins:
 move.l   #%11111111111111110000000000000000,(a0)+  ;Bits in der Bitplane
 dbra     d1,meins ;Mit "dbra" kann man Zähl-       ;setzen
                   ;schleifen in Assembler
                   ;realisieren. Bei dieser
                   ;Anweisung wird D1 bis auf
                   ;-1 runtergezählt. Ist D1
                   ;noch nicht -1, so wird zum
                   ;Label "meins" gesprungen.
                   ;Eine DBRA-Schleife zählt
                   ;also immer bis -1 und nicht
                   ;bis 0.
 move.l   #(10*16)-1,d1  ;10 Paare um eine Zeile zu füllen (320 Punkte)
                         ;16 Zeilen sind zu füllen
mzwei:
 move.l   #%00000000000000001111111111111111,(a0)+  ;Bits in der Bitplane
 dbra     d1,mzwei                                  ;setzen
 dbra     d0,mpaar
 rts

;Routine um den Bildschirm zu scrollen
;-------------------------------------
;Die Bitplane wird 256 Zeilen gescrollt. Ob wir hoch oder runter scrollen
;müssen, merken wir uns in "richtung".
;-------------------------------------
scroll:
;Bitplanepointer auslesen
;++++++++++++++++++++++++
 lea      bitplanepointer,a1    ;Bitplanepointer nach A1
 move.w   2(a1),d0;             ;High-Word auslesen
 swap     d0                    ;Words vertauschen
 move.w   6(a1),d0              ;Low-Word auslesen
;++++++++++++++++++++++++
 tst.b    richtung              ;"richtung" = 0 ?
 beq.w    hoch                  ;wenn ja -> hoch scrollen
 cmpi.l   #bitplane,d0          ;Bild wieder an Ausgangsposition ?
 beq.s    setzerunter           ;wenn ja -> "richtung" runter setzen
 sub.l    #40,d0                ;eine Zeile nach unten scrollen
 bra.s    scrollende
setzerunter:
 clr.b    richtung              ;"richtung" löschen
 bra.s    scrollende
hoch:
 cmpi.l   #bitplane+(40*256),d0 ;Bild schon 256 Zeile nach oben gescrollt ?
 beq.s    setzerauf             ;wenn ja -> "richtung" hoch setzen
 add.l    #40,d0                ;eine Zeile nach oben scrollen
 bra.s    scrollende
setzerauf:
 move.b   #$ff,richtung         ;hex. FF nach "richtung" kopieren
 rts
;Bitplanepointer neu eintragen
;+++++++++++++++++++++++++++++
scrollende:
 lea      bitplanepointer,a1    ;Bitplanepointer nach A1
 move.w   d0,6(a1)              ;Low-Word eintragen
 swap     d0                    ;Words vertauschen
 move.w   d0,2(a1)              ;High-Word eintragen
 rts

;Copperliste
;-----------
 SECTION Cl,CODE_C
Copperliste:
 dc.w     $008e,$2c81  ;DIWSTRT
 dc.w     $0090,$2cc1  ;DIWSTOP
 dc.w     $0092,$0038  ;DDFSTRT
 dc.w     $0094,$00d0  ;DDFSTOP
 dc.w     $0100,$1200  ;BPLCON0
 dc.w     $0108,$0000  ;BPL1MOD
 dc.w     $010a,$0000  ;BPL2MOD
bitplanepointer:
 dc.w     $00e0,$0000  ;BPL1PTH
 dc.w     $00e2,$0000  ;BPL1PTL
 dc.w     $0180,$0000  ;COLOR00
 dc.w     $0182,$0fff  ;COLOR01
 dc.w     $ffff,$fffe  ;Copperlistenende

;Bitplane
;--------
 SECTION Bp,BSS_C
bitplane:
 ds.b     20480

 END

Zurück zum Programmierkurs